{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "095b0666",
   "metadata": {},
   "source": [
    "# Example 11: Encouraging linearity\n",
    "\n",
    "In cases where we don't know how deep we should set KANs to be, one strategy is to try from small models, grudually making models wider/deeper until we find the minimal model that performs the task quite well. Another strategy is to start from a big enough model and prune it down. This jupyter notebook demonstrates cases where we go for the second strategy. Besides sparsity along width, we also want activation functions to be linear ('shortcut' along depth)."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ef047a0f",
   "metadata": {},
   "source": [
    "There are two relevant tricks: \n",
    "\n",
    "(1) set the base function 'base_fun' to be linear; \n",
    "\n",
    "(2) penalize spline coefficients. When spline coefficients are zero, the activation function is linear."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "91301ca0",
   "metadata": {},
   "source": [
    "$f(x)={\\rm sin}(\\pi x)$. Although we know a [1,1] KAN suffices, we suppose we don't know that and use a [1,1,1,1] KAN instead."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "77f9e16d",
   "metadata": {},
   "source": [
    "without trick"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "c881665b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "cuda\n",
      "checkpoint directory created: ./model\n",
      "saving model version 0.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "| train_loss: 3.74e-04 | test_loss: 3.84e-04 | reg: 8.88e+00 | : 100%|█| 20/20 [00:05<00:00,  3.79it"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "saving model version 0.1\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "from kan import *\n",
    "\n",
    "device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n",
    "print(device)\n",
    "\n",
    "# create dataset f(x,y) = sin(pi*x). This task can be achieved by a [1,1] KAN\n",
    "f = lambda x: torch.sin(torch.pi*x[:,[0]])\n",
    "dataset = create_dataset(f, n_var=1, device=device)\n",
    "\n",
    "model = KAN(width=[1,1,1,1], grid=5, k=3, seed=0, noise_scale=0.1, device=device)\n",
    "\n",
    "model.fit(dataset, opt=\"LBFGS\", steps=20);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "201ceacf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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qtraWj300EMqKSlpgqmB1oW4oE0JBALKzMzUmjVr5Ha7NXPmTI0cObJRF0O2b99eDz30kKKiorRz505lZ2dz9hjaPOKCNsMYo/Xr12vevHkKBAIaO3aspk6d2uhbuViWpYEDB2rSpEmSpGXLlumzzz7j8BjaNOKCNsEYo127dmnatGmqqKjQf/zHf2jevHnyer2O/PfdbrfuuOMO9ezZUwcOHNDjjz/O1fto04gL2oTKykpNnz5du3btUkxMjObPn9/gM8Ma6txzz9Utt9wiy7K0Zs0abd26ldUL2izigpAXCAQ0f/58rVu3Th6PR/fee68uueQSx286aVmWrrvuOvXp00cVFRXKysqS3+939M8AWgvigpBmjNFf//pXzZs3T7Zta+zYsbrxxhub7ImSXbp00ZQpU2RZltavX6/t27ezekGbRFwQsowx2rNnj6ZNm6aDBw8qKSlJGRkZioiIaLI/07IspaamKiEhQZWVlXrqqafYe0GbRFwQsmpqajRnzhx99tln6tChg5544gn17NmzSZ7BUl+XLl10ww03yLIs5ebm6vPPP2f1gjaHuCAkGWP0yiuvaNWqVXK5XEpLS1NycnKTh0X61+pl/Pjx6tmzpw4ePKjFixcTF7Q5xAUhxxijr776Svfee69qamp06aWXavr06U36aOLj9ejRQxMmTJAk5eTk6Jtvvmm2PxtoCYgLQk51dbVmzpypwsJCdenSRfPmzVNUVFSzzmBZliZNmqTY2FiVlpbqhRdeYPWCNoW4IKQYY/Tcc88pNzdXbrdbs2bNOuP7hjVWQkKCRo4cKUn685//rAMHDjT7DECwEBeElM8//1yPPPKI/H6/fvvb3+r6669vstOOT8XlcumGG26Q1+vVrl27tH79elYvaDOIC0JGdXW1Zs2apb179youLk6PPfaYY7d3OROWZenCCy/U4MGDZdu2li1bpu+//z5o8wDNibggJBhjtHLlSm3YsKHucFhSUlJQDofV165du7rVU15enrZt28bqBW0CcUHI8Hg86ty5s37zm99o0qRJQQ+L9K/Vy69//WslJibq8OHDeu6554gL2gTigpBw9L5eb731lrKzs4N6OOx4nTp10rhx4yRJubm5+vbbb4M8EdD0iAtChmVZ6tevn3r37t0iVi1HWZala665Rp06dVJpaan+8pe/sHpByCMuQDNISEjQ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0EMP1cUGaI2IC0KCZVmyLKvVxuWbb77Ro48+qm+++UYVFRXigAJau9b5SQRCSCAQ0BNPPKFvvvlGnTp10o033thqIwkcxb9gIIiMMcrLy9OKFSskSTfccIPOP//8IE8FNB5xAYKourpaDz74oA4dOqTExETdfvvtrFoQEvhXDASJMUavvvqqNm/eLI/Ho5kzZ6p79+7BHgtwBHEBgsAYoz179uixxx6T3+/X0KFDdfXVV3NxJkIGcQGCwLZtPfnkk9q5c6eioqJ03333yev1BnsswDHEBWhmxhht2bJFy5YtkyT94Q9/0M9//nNWLQgpxAVoZhUVFZozZ44OHjyovn37avr06dzmBSGHuADNyBijZcuW6b333lNYWJjmzJmjuLi4YI8FOI64AM3EGKPPP/9cc+fOlW3buvzyy3XllVdyOAwhibgAzaS6ulqzZs3Svn37FBcXpwceeEDh4eHBHgtoEsQFaAa2bWvp0qVav369PB6PZs2apfPOO49VC0IWcQGamDFGn3zyiR555BEFAgFddtllmjRpEmFBSCMuQBMyxqisrEx33HGHvvvuO51zzjnKyMjgmhaEPOICNKGamhrNmTNHW7ZsUUREhDIyMtS3b19WLQh5xAVoIrZta/HixXUXS95888266qqrCAvaBOICNAFjjNauXat7771XtbW1Gj58uO69916FhYUFezSgWRAXwGHGGH344Ye65ZZbdPDgQf30pz/VU089pY4dOwZ7NKDZEBfAQcYY5efn6w9/+INKSkrUs2dPLVmyRL179+ZwGNoU4gI4xBijf/zjH5o4caJ27dqlzp07a9GiRbr44osJC9oc4gI44Oi1LOPHj9eOHTvUqVMnLVy4UL/+9a8JC9ok4gI0kjFGH3zwga655hrt2LFDMTExeuaZZzR69GgeWYw2i3/5QCPYtq21a9cqNTVV//znP9WlSxctXrxYV111FWFBm8a/fuAM+f1+Pffcc7r22mtVUlKis88+WytXrtQVV1xBWNDmeYI9ANDaGGN0+PBhPf7445o7d66qq6vVr18/LV26lM174AjiApwGY4zKy8uVnp6uFStWyO/367/+67+0aNEibusC1ENcgAYyxuif//ynbr31Vr311luyLEtjxoxRdna2unfvTliAejgwDDSAMUYff/yxrrzySr355psKCwtTWlqali5dSliAE2DlApyC3+/Xq6++qunTp2vfvn3q2LGjHnroId14440KCwsjLMAJEBfgRxhjVFVVpXnz5umJJ55QVVWVzj33XC1YsEC//e1vOSMMOAniApyAMUYlJSWaPn26cnJyFAgE9J//+Z9auHChfvazn7FaAU6BH72A4xy9lcuVV16pV155RZI0fvx45eTkEBaggVi5APX4/X795S9/0bRp07Rnzx6dddZZSk9P15133imv10tYgAYiLoD+tVqprKzU448/Xre/0rNnTz3xxBO68sor5Xa7gz0i0KoQF7R5xhgVFRVp+vTpev311xUIBPTzn/9cTz/9tPr3789qBTgD7LmgTbNtWx999JGuuOIK5eTkyLIsTZgwQatXryYsQCOwckGbZIxRbW2tVq5cqVmzZum7775Thw4dNHPmTE2dOpX9FaCRiAvaHGOMDhw4oPvvv19Lly7V999/r969eyszM1OXXXYZ+yuAA4gL2hRjjD799FPdfvvt+uCDDyRJw4YNU3Z2ts477zxWK4BD2HNBm3D0MNiLL76oUaNG6f3331d4eLhuv/12vfzyy4QFcBgrF4Q8Y4z279+vhx9+WEuWLNHhw4fVo0cPZWRk6He/+508Hg9hARxGXBDSbNtWXl6e7rrrLuXl5UmSfvGLXygrK0vnn38+UQGaCHFBSDLGqKKiQosWLdLcuXNVVlYmr9eryZMn65577lFMTAxhAZoQcUHIsW1b+fn5mj17tjZt2qRAIKCEhAQ99thjuvzyyzkMBjQD4oKQUlZWpmeeeUbz58/X/v37FRYWpjFjxujhhx9WfHw8UQGaCXFBSDDGaP369XrggQeUn58vY4x69eqlOXPm6JprrlF4eDhhAZoRcUHI+Pvf/678/Hx5vV5dc801uueee9S7d2+iAgQBcUHIuOGGG/T1119r3LhxGjp0qMLCwmSMkTEm2KOdFtu2W93MwPEsw79itHI+n0+pqanq1auXAoFASNy+paCgQC+88II6d+4c7FGAM0Jc0OrZtq39+/fLtu1gj+IYl8ul2NjYkAgl2ibiAgBwHHsuQAPV/zmMkwSAk+PGlUAD5efny+12Kz8/P9ijAC0ecQEAOI64AAAcR1wAAI4jLgAAxxEXAIDjiAsAwHHEBQDgOOICAHAccQEAOI64AAAcR1wAAI4jLgAAxxEXAIDjiAsAwHHEBQDgOOICAHAccQEAOI64AA1gjFF5ebkkqby8/JhHHgP4IeICnITP51N2drYSExOVnJwsY4ySk5OVmJio7Oxs+Xy+YI8ItEiW4Ucw4IQ2btyoMWPGqKqqSpKOWa1YliVJioyMVE5OjlJSUoIyI9BSERfgBDZu3KgRI0bIGCPbtn/0+1wulyzLUm5uLoEB6iEuwHF8Pp969uyp6urqk4blKJfLJa/Xq6KiIkVHRzf9gEArwJ4LcJznn39eVVVVDQqLJNm2raqqKq1YsaKJJwNaD1YuQD3GGCUmJqqgoOC0zgizLEvx8fHauXNn3X4M0JYRF6Ce/fv3q0uXLo16f2xsrIMTAa0Th8WAeioqKhr1/kOHDjk0CdC6ERegnvbt2zfq/R06dHBoEqB1Iy5APbGxsUpISDjtfRPLspSQkKCYmJgmmgxoXYgLUI9lWZo6deoZvTctLY3NfOAINvSB43CdC9B4rFyA40RHRysnJ0eWZcnlOvlH5OgV+qtXryYsQD3EBTiBlJQU5ebmyuv1yrKsHxzuOvo1r9erdevWafjw4UGaFGiZiAvwI1JSUlRUVKSsrCzFx8cf81p8fLyysrJUXFxMWIATYM8FaABjjA4cOKBDhw6pQ4cOiomJYfMeOAniAgBwHIfFAACOIy4AAMcRFwCA44gLAMBxxAUA4DjiAgBwHHEBADiOuAAAHEdcAACOIy4AAMcRFwCA44gLAMBxxAUA4DjiAgBw3P8BieRdtZ3ZE5kAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 500x600 with 7 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "model.plot()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "13c725a5",
   "metadata": {},
   "source": [
    "with tricks"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "a22ffff3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "checkpoint directory created: ./model\n",
      "saving model version 0.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "| train_loss: 8.89e-03 | test_loss: 8.40e-03 | reg: 1.83e+01 | : 100%|█| 20/20 [00:04<00:00,  4.20it"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "saving model version 0.1\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "from kan import *\n",
    "\n",
    "# create dataset f(x,y) = sin(pi*x). This task can be achieved by a [1,1] KAN\n",
    "f = lambda x: torch.sin(torch.pi*x[:,[0]])\n",
    "dataset = create_dataset(f, n_var=1, device=device)\n",
    "\n",
    "# set base_fun to be linear\n",
    "model = KAN(width=[1,1,1,1], grid=5, k=3, seed=0, base_fun='identity', noise_scale=0.1, device=device)\n",
    "\n",
    "# penality spline coefficients\n",
    "model.fit(dataset, opt=\"LBFGS\", steps=20, lamb=1e-4, lamb_coef=10.0);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "c82c8db5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 500x600 with 7 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "model.plot(beta=10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e3c92b0d",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.16"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
